/*
 * Copyright (C) 2006-2007 Eskil Bylund
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

using System;

using Gtk;
using Glade;
using Mono.Unix;

namespace DCSharp.Gui
{
	public class MessageDialog : Dialog
	{
		private Image image;
		private Label primaryLabel;
		private Label secondaryLabel;
		private Expander detailsExpander;
		private TextView detailsTextView;

		private string primaryText;
		private string secondaryText;
		private string detailedText;
		private MessageType messageType;

		#region Constructors

		public MessageDialog(string primaryText, string secondaryText,
			string detailedText, MessageType messageType, Window parent) :
			base(String.Empty, parent, DialogFlags.NoSeparator)
		{
			BorderWidth = 6;
			WindowPosition = WindowPosition.CenterOnParent;

			// Create the widgets
			VBox root = new VBox(false, 12);
			VBox.PackStart(root, true, true, 6);

			HBox hbox = new HBox(false, 12);
			root.PackStart(hbox, false, true, 0);

			image = new Image();
			image.IconSize = (int)IconSize.Dialog;
			image.Yalign = 0;
			hbox.PackStart(image, false, true, 0);

			VBox vbox = new VBox(false, 12);
			hbox.PackStart(vbox, true, true, 0);

			primaryLabel = new Label();
			primaryLabel.Selectable = true;
			primaryLabel.Xalign = 0;
			vbox.PackStart(primaryLabel, false, true, 0);

			secondaryLabel = new Label();
			secondaryLabel.LineWrap = true;
			secondaryLabel.Selectable = true;
			secondaryLabel.Xalign = 0;
			vbox.PackStart(secondaryLabel, false, true, 0);

			detailsExpander = new Expander(Catalog.GetString("Details"));
			root.PackStart(detailsExpander, true, true, 0);

			ScrolledWindow sw = new ScrolledWindow();
			sw.HscrollbarPolicy = PolicyType.Automatic;
			sw.VscrollbarPolicy = PolicyType.Automatic;
			sw.ShadowType = ShadowType.In;
			detailsExpander.Add(sw);

			detailsTextView = new TextView();
			sw.Add(detailsTextView);

			VBox.ShowAll();

			// Initialize
			PrimaryText = primaryText;
			SecondaryText = secondaryText;
			DetailedText = detailedText;
			MessageType = messageType;
		}

		#endregion

		#region Properties

		public string PrimaryText
		{
			get { return primaryText; }
			set
			{
				primaryText = value;
				primaryLabel.Markup = String.Format(
					"<span size=\"large\" weight=\"bold\">{0}</span>",
					primaryText);
				primaryLabel.Visible = primaryText != null;
			}
		}

		public string SecondaryText
		{
			get { return secondaryText; }
			set
			{
				secondaryText = value;
				secondaryLabel.Text = secondaryText;
				secondaryLabel.Visible = secondaryText != null;
			}
		}

		public string DetailedText
		{
			get { return detailedText; }
			set
			{
				detailedText = value;
				detailsTextView.Buffer.Text = detailedText != null ? detailedText : String.Empty;
				detailsExpander.Visible = detailedText != null;
				Resizable = detailedText != null;
			}
		}

		public MessageType MessageType
		{
			get { return messageType; }
			set
			{
				messageType = value;
				image.Visible = true;

				switch (messageType)
				{
					case MessageType.Error:
						image.Stock = Stock.DialogError;
						break;

					case MessageType.Info:
						image.Stock = Stock.DialogInfo;
						break;

					case MessageType.Question:
						image.Stock = Stock.DialogQuestion;
						break;

					case MessageType.Warning:
						image.Stock = Stock.DialogWarning;
						break;

					default:
						image.Visible = false;
						break;
				}
			}
		}

		#endregion
	}	
}
